package service;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;

import command.LitiasisCommand;

public class DiagnosticianServiceImpl implements DiagnosticianService {

	@Deprecated
	private RuleBase ruleBase;

	private RuleBase ruleBase1;
	private RuleBase ruleBase2;
	private RuleBase ruleBase3;

	public DiagnosticianServiceImpl() {
		ruleBase = leerReglas("litiasis.drl");
		
		ruleBase1 = leerReglas("litiasis1.drl");
		ruleBase2 = leerReglas("litiasis2.drl");
		ruleBase3 = leerReglas("litiasis3.drl");
		
	}

	public List<String> diagnose(LitiasisCommand litiasis, int step) {
		if (step < 1 || step > 3) {
			throw new IllegalArgumentException("El step debe estar entre 1 y 3");
		}

		WorkingMemory workingMemory = null;		
		switch (step) {
			case 1:
				workingMemory = ruleBase1.newStatefulSession();
				break;
			case 2:
				workingMemory = ruleBase2.newStatefulSession();
				break;
			case 3:
				workingMemory = ruleBase3.newStatefulSession();
				break;
		}
		workingMemory.insert(litiasis);
		int result = workingMemory.fireAllRules();		
		workingMemory.clearAgenda();		
		
		boolean clearList = result <= 0;
		return litiasis.getDiagnosticos(step, clearList);
	}

	private static RuleBase leerReglas(String filename) {
		// Leemos el archivo de reglas (DRL)
		InputStream isfile = DiagnosticianServiceImpl.class
				.getResourceAsStream(filename);
		Reader source = new InputStreamReader(isfile);

		// Construimos un paquete de reglas
		PackageBuilder builder = new PackageBuilder();

		// Parseamos y compilamos las reglas en un �nico paso
		try {
			builder.addPackageFromDrl(source);
		} catch (DroolsParserException e) {
			throw new RuntimeException("Error al cargar el archivo de reglas");
		} catch (IOException e) {
			throw new RuntimeException("Error al cargar el archivo de reglas");
		}

		// Verificamos el builder para ver si hubo errores
		if (builder.hasErrors()) {
			System.out.println(builder.getErrors().toString());
			throw new RuntimeException(
					"No se pudo compilar el archivo de reglas.");
		}

		// Obtenemos el package de reglas compilado
		Package pkg = builder.getPackage();

		// Agregamos el paquete a la base de reglas
		// (desplegamos el paquete de reglas).
		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
		ruleBase.addPackage(pkg);
		return ruleBase;
	}

}
